package com.game.autoTool.project.web.common;

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * 单目标识图-没有测试
 */
public class TemplateMatching {
    static {
        // 加载OpenCV本地库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        // 1. 加载源图像和模板图像
        Mat source = Imgcodecs.imread("imageTemplate/识图案例.jpg");
        Mat template = Imgcodecs.imread("imageTemplate/游荡妖魔-水灵仙.jpg");
        
        if(source.empty() || template.empty()) {
            System.out.println("无法加载图像文件");
            return;
        }

        // 2. 创建结果矩阵
        Mat result = new Mat();
        int resultCols = source.cols() - template.cols() + 1;
        int resultRows = source.rows() - template.rows() + 1;
        result.create(resultRows, resultCols, CvType.CV_32FC1);

        // 3. 执行模板匹配
        Imgproc.matchTemplate(source, template, result, Imgproc.TM_CCOEFF_NORMED);
        
        // 4. 找到最佳匹配位置
        Core.MinMaxLocResult mmr = Core.minMaxLoc(result);
        Point matchLoc;
        if (Imgproc.TM_SQDIFF == Imgproc.TM_SQDIFF_NORMED) {
            matchLoc = mmr.minLoc; // 对于SQDIFF方法使用最小值
        } else {
            matchLoc = mmr.maxLoc; // 对于其他方法使用最大值
        }

        // 5. 在源图像上绘制矩形标记匹配区域
        Imgproc.rectangle(source, matchLoc, 
                         new Point(matchLoc.x + template.cols(), matchLoc.y + template.rows()),
                         new Scalar(0, 255, 0), 3);

        // 6. 保存结果
        Imgcodecs.imwrite("匹配结果.jpg", source);
        
        System.out.println("匹配完成！最佳匹配位置: (" + matchLoc.x + ", " + matchLoc.y + ")");
        System.out.println("置信度: " + mmr.maxVal);
    }
}